/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hojadetrabajo4;
import java.util.Scanner;
import java.util.InputMismatchException;
/**
 *
 * @author RAUL
 */
public class Hojadetrabajo4 {
     
    static float op1, op2, op, res;
    static String signo; 
    static Stackito<Float> operadora_stack ; 
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner ingreso = new Scanner(System.in); //crea un objeto scanner para ingresar caracteres desde el teclado
	int opcion;
        int index = -1;  
        operadora_stack = new Stackito<Float> () ;
        
        do{
            menu(); // despliega el menu principal de opciones 
			opcion = (int)obtenerNumero("Que es lo que desea realizar?: "); // se pide que se ingrese un numero y va revisando con que opcion concuerda
			switch(opcion){
				case 1:
                                        index ++;
                                        operadora_stack.setIndex(index);
                                        op = (int)obtenerNumero("Que operando desea ingresar?: ");
					operadora_stack.push(op);
                                        
                                        break;  
				case 2:
					if(operadora_stack.empty() !=true){
                                            System.out.println("Ingrese el operador aritmetico solo puede ingresar(+, -, *, /):");
                                            signo = ingreso.nextLine(); 
                                            op1 = operadora_stack.peek();
                                            index --;
                                            operadora_stack.setIndex(index);
                                            op2 = operadora_stack.peek();
                                            index --;
                                            operadora_stack.setIndex(index);
                                            
                                            if("+".equals(signo)){
                                                res = op1 + op2;
                                                index ++;
                                                operadora_stack.setIndex(index);
                                                operadora_stack.push(res);
                                                   
                                                System.out.println("El resultado es:" + res + "\n") ;
                                            }
                                            if("-".equals(signo)){
                                                res = op1 - op2;
                                                index ++;
                                                operadora_stack.setIndex(index);
                                                operadora_stack.push(res);
                                                System.out.println("El resultado es:" + res + "\n") ;
                                            }
                                            if("*".equals(signo)){
                                                res = op1 * op2;
                                                index ++;
                                                operadora_stack.setIndex(index);
                                                operadora_stack.push(res);
                                                System.out.println("El resultado es:" + res + "\n") ;
                                            }
                                            if("/".equals(signo)){
                                                res = op1 / op2;
                                                index ++;
                                                operadora_stack.setIndex(index);
                                                operadora_stack.push(res);
                                                System.out.println("El resultado es:" + res + "\n") ;
                                        }   }
                                             break; 
				case 3:
					if(operadora_stack.empty() != true)
						System.out.println(operadora_stack);
					else
						System.out.println("Todavia no ha ingresado ningun operando.");
					break;
                                    
                                case 4:
					if(operadora_stack.empty() != true){
						operadora_stack.pop();
						index --;
						operadora_stack.setIndex(index);
						System.out.println("Su  pila es: \n");
						System.out.println(operadora_stack);
					}
					else
						System.out.println("Todavia no ha ingresado ningun valor.");
					break;
				case 5: 
					System.out.println("Gracias por utilizar la calculadora postfix");
					break;
                                default:
                                        System.out.println("\nERROR: El numero ingregaso es invalido. \n"); // este es un default si no se ingresa ninguno de los anteriores se meustra un error
    
                    }
            } while (opcion != 5); 

    } 
   
    /**
     * este metodod obtiene los dos operandos del stack y lso opera y devuelve la suma
     * @return devuelve el valor de la suma de los dos operandos
     */
    public static float sumar(){
        res = op1 + op2;
       // index ++;
        //operadora_stack.setIndex(index);
        //operadora_stack.push(res);
        return res;
    }
    /**
     * este metodo resta los dos operandos y devuelve el resultado
     * @return regresa el valor de la resta de los dos operandos
     */
    public static float restar(){
        res = op1 - op2;
       // index ++;
        //operadora_stack.setIndex(index);
       // operadora_stack.push(res);
        return res;
    }
    /**
     * este metodo hace la multiplicacion del os dos valores metidos en el stack
     * @return este regresa el valor de la multiplicacion de los dos valores del stack
     */
    public static float multiplicacion(){
        res = op1 * op2;
        //index ++;
        //operadora_stack.setIndex(index);
       // operadora_stack.push(res);
        return res;
    }
    /**
     * este metodo divide los dos valores guardados en el stack
     * @return regresa un float que es el resultado de la division de los dos operandos
     */
    public static float division(){
        res = op1 / op2;
       // index ++;
        //operadora_stack.setIndex(index);
        //operadora_stack.push(res);
        return res;
    }
    
    /**
     * este es el menu donde se indican que es lo que se puede realizar con el stack
     */
    public static void menu(){ //este es el menu de la calculadora
        System.out.println();
	System.out.println("+--------------------------------------------+");
	System.out.println("+--    MENU DE CALCULADORA POSTFIX       ----+");
	System.out.println("| 1. Ingreso de Operando                     |");
	System.out.println("| 2. Continuar operacion                     |");
	System.out.println("| 3. Ver el stack                            |");
        System.out.println("| 4. Quitar operando                         |");
        System.out.println("| 5. Salir del Programa                      |");
        System.out.println("+--------------------------------------------+");
		}
    
    
    
    /**
     * 
     * @param mensaje este muestra un string donde se pide lo que se ingrese
     * @return regresa el numero si es que se ingreso un numero
     */
    public static double obtenerNumero(String mensaje){ // este sirve para revisar si el dato ingresado es un entero en el rango pedido
        Scanner ingreso = new Scanner(System.in);
        double num = 0;
        
        System.out.print(mensaje);
        try{
            num = ingreso.nextDouble();
        }
        catch(InputMismatchException exception){
          
            System.out.println("\nERROR: Dato invalido. ");
        }
        finally{
            ingreso.nextLine();//Atrapar el ENTER
        }
        return num;
    }

}

    

